home *** CD-ROM | disk | FTP | other *** search
/ Aminet 33 / Aminet 33 - October 1999.iso / Aminet / dev / c / amiga-c-jun99.lha / amiga-c / june1999 / files / list.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-07-03  |  3.8 KB  |  152 lines

  1. /*
  2. ** list.c
  3. **
  4. ** A simple 2 column MUI listview
  5. **
  6. ** crashes on destructor hook!
  7. */
  8. #include "demo.h"
  9.  
  10.  
  11. struct TBF
  12. {
  13.  char Name[50];
  14.  char SName[50];
  15. };
  16.  
  17. /* display hook for our list */
  18. SAVEDS ASM LONG list_main_dispfunc(REG(a0) struct Hook *hook, REG(a2) char **array, REG(a1) struct TBF *tb)
  19. {
  20.  if (tb)
  21.   {
  22.    *array++ = tb->Name; // col 0
  23.    *array = tb->SName; // col 1
  24.   }
  25.  else /* no entry so titles are required */
  26.   {
  27.   *array++ = "\033uName";
  28.   *array = "\033uSurname";
  29.   }
  30.  return(0);
  31. }
  32.  
  33. static struct Hook list_main_disphook =
  34. {
  35.  {NULL, NULL},
  36.  (void *)list_main_dispfunc,
  37.  NULL, NULL
  38. };
  39.  
  40.  
  41. static SAVEDS ASM APTR list_main_consfunc(REG(a0) struct Hook *hook, REG(a2) APTR pool, REG(a1) struct TBF *entry)
  42. {
  43.  struct TBF *new_entry = NULL;
  44.  
  45.  new_entry = (struct TBF *)AllocPooled(pool, sizeof(struct TBF));
  46.  
  47.  if (new_entry)
  48.   {
  49.    if(entry) { strcpy(new_entry->Name, entry->Name); strcpy(new_entry->SName, entry->SName); }
  50.    return(new_entry);
  51.   }
  52.   return(NULL);
  53. }
  54.  
  55. static VOID SAVEDS ASM list_main_destfunc(REG(a0) struct Hook *hook, REG(a2) APTR pool, REG(a1) struct TBF *entry)
  56. {
  57.  if (entry)
  58.  {
  59.   // exception 3 will be thrown here - GURU 80000003
  60.   // same as in MUI docs so why does it crash ?
  61.   FreePooled(pool, entry, sizeof(struct TBF));
  62.  }
  63. }
  64.  
  65. // construct and destruct hooks for the list
  66. static struct Hook list_main_conshook = { {NULL, NULL}, (void *)list_main_consfunc, NULL, NULL };
  67. static struct Hook list_main_desthook = { {NULL, NULL}, (void *)list_main_destfunc, NULL, NULL };
  68.  
  69.  
  70. /* interface */
  71. struct interface
  72. {
  73.     APTR app;
  74.     APTR mainwin;
  75.     APTR LV_Main;
  76.     APTR LI_List;
  77.     APTR BT_Quit;
  78. } App;
  79.  
  80. int main(int argc, char *argv[])
  81. {
  82.  int x = 0;
  83.  
  84.  struct TBF a;
  85.  
  86.  strcpy(a.Name, "Test"); strcpy(a.SName, "Name");
  87.  
  88.  init(); /*  open MUI */
  89.  
  90.  /* create interface */
  91.  
  92.  App.app=ApplicationObject,
  93.                  MUIA_Application_Title,         "List1",
  94.                  MUIA_Application_Version,        "$VER: List1 1.0",
  95.                  MUIA_Application_Author,        "Stuart Kelly",
  96.                  MUIA_Application_Description,    "Listview",
  97.                  MUIA_Application_Copyright,    "Copyright 1999 © Stuart Kelly",
  98.                  MUIA_Application_Base,            "LIST1",
  99.  
  100.                  SubWindow, App.mainwin = WindowObject,
  101.                      MUIA_Window_Title,    "Listview Example",
  102.                      MUIA_Window_ID,        MAKE_ID('L','I','S','T'),
  103.                      WindowContents, VGroup,
  104.                          Child, App.LV_Main = ListviewObject,
  105.                              MUIA_Listview_Input, TRUE,
  106.                              MUIA_Listview_List, App.LI_List = ListObject,
  107.                                  InputListFrame,
  108.                                  MUIA_List_Title, TRUE,
  109.                                  MUIA_List_ConstructHook, &list_main_conshook,
  110.                                  MUIA_List_DestructHook, &list_main_destfunc,
  111.                                  MUIA_List_DisplayHook, &list_main_disphook,
  112.                                  MUIA_List_Format, "BAR,",
  113.                                  End,
  114.                          End,
  115.  
  116.                          Child, App.BT_Quit = SimpleButton("_Quit"), End,
  117.  
  118.                  End, /* end window object */
  119.  
  120.              End; /* application object end */
  121.  
  122.  if (!App.app) fail(App.app, "Failed to create application.");
  123.  
  124.  /* mainwin notifcations & help */
  125.  DoMethod(App.mainwin, MUIM_Notify, MUIA_Window_CloseRequest, TRUE, App.app, 2, MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit);
  126.  DoMethod(App.BT_Quit, MUIM_Notify, MUIA_Pressed, FALSE, App.app, 2, MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit);
  127.  
  128.  set(App.BT_Quit, MUIA_ShortHelp, "Quit the program");
  129.  set(App.LV_Main, MUIA_ShortHelp, "A 2 column listview.\nWith Titles.");
  130.  
  131.  /* insert items into out 2 column list ! */
  132.  DoMethod(App.LI_List, MUIM_List_InsertSingle, &a, MUIV_List_Insert_Bottom);
  133.  
  134.  
  135.  set(App.mainwin, MUIA_Window_Open, TRUE);
  136.  {
  137.   ULONG sigs = 0;
  138.  
  139.   while (DoMethod(App.app, MUIM_Application_NewInput, &sigs) != MUIV_Application_ReturnID_Quit)
  140.    {
  141.     if (sigs)
  142.      {
  143.       sigs = Wait(sigs | SIGBREAKF_CTRL_C);
  144.       if (sigs & SIGBREAKF_CTRL_C) break;
  145.      }
  146.    }
  147.   }
  148.  /* close window and dispose interface */
  149.  set(App.mainwin, MUIA_Window_Open, FALSE);
  150.  
  151.  fail(App.app, NULL);
  152. }